Linux Shell 监控网络延迟
1 脚本说明
- 使用
mtr
获取 目标的平均延迟(Avg) - 记录日志到文件
- 在延迟超过阈值时报警
2 ✅ 使用 mtr
的网络延迟监控脚本(net_latency_check.sh
)
#!/bin/bash
# ============================
# 基于 mtr 的网络延迟监控脚本
# ============================
TARGET_IP="192.168.1.100" # 修改为你的目标 IP
THRESHOLD_MS=100 # 延迟报警阈值(单位:ms)
LOG_FILE="/var/log/net_latency.log"
SLEEP_INTERVAL=5 # 检测间隔(秒)
MTR_PATH=$(which mtr) # 自动寻找 mtr 路径
# 报警函数(可扩展邮件、钉钉等)
alert() {
local message=$1
local timestamp=$(date '+%F %T')
echo "$timestamp [ALERT] $message"
echo "$timestamp [ALERT] $message" >> "$LOG_FILE"
}
# 检测函数
check_latency() {
if ! $MTR_PATH -rwzc 1 "$TARGET_IP" > /tmp/mtr_out 2>/dev/null; then
alert "目标 $TARGET_IP 无法到达!"
echo "$(date '+%F %T') [ERROR] MTR failed for $TARGET_IP" >> "$LOG_FILE"
return
fi
# 提取最后一跳的 Avg 延迟
RTT=$(tail -n 1 /tmp/mtr_out | awk '{print $(NF-1)}')
# 判断是否数字
if [[ ! $RTT =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
alert "无法解析延迟信息:$RTT"
return
fi
# 写入日志
echo "$(date '+%F %T') [INFO] MTR to $TARGET_IP: ${RTT} ms" >> "$LOG_FILE"
# 判断是否超阈值
RTT_INT=${RTT%.*}
if (( RTT_INT > THRESHOLD_MS )); then
alert "延迟过高:${RTT} ms,阈值为 ${THRESHOLD_MS} ms"
fi
}
# 主循环
while true; do
check_latency
sleep $SLEEP_INTERVAL
done
3 📌 脚本说明
-
使用
mtr -rwzc 1
:-
-r
:报告模式 -
-w
:宽屏 -
-z
:避免名称解析,提升速度 -
-c 1
:只发一个探测包(只做一次快速检测)
-
-
解析输出中 最后一跳的 Avg 列值,代表当前到目标的平均延迟
-
自动判断 mtr 是否可用
4 ✅ 使用步骤
# 安装 mtr(如未安装)
sudo apt install mtr # Ubuntu/Debian
sudo yum install mtr # CentOS/RHEL
# 保存脚本
nano mtr_latency_check.sh
# 复制粘贴内容,保存退出
chmod +x mtr_latency_check.sh
# 后台运行
nohup ./mtr_latency_check.sh &
5 🧩 示例输出日志(/var/log/net_latency.log)
2025-04-03 20:30:01 [INFO] MTR to 192.168.1.100: 27.4 ms
2025-04-03 20:30:06 [INFO] MTR to 192.168.1.100: 35.7 ms
2025-04-03 20:30:11 [ALERT] 延迟过高:135.4 ms,阈值为 100 ms